// il seguente programma dichiara due array di tipo potenze
// uno inizializzato e l'altro no

#include <iostream>
#include <new>
using namespace std;


// Secondo esempio per creare oggetti inizializzati e non inizializzati
// N.B. non è possibile inizializzare array allocati dinamicamente

// Il costruttore standard viene impiegato per costruire l'array non inizializzato di3 e
// l'array allocato dinamicamente;
// il costruttore parametrizzato viene richiamato per creare gli oggetti dell'array di2

class potenze {
int x;
public:
	// overloading del costruttore in due modi
	potenze() {x=0;} // senza inizializzazione
	potenze(int n) {x=n;} // con inizializzazione
	int prendi_x() {return x;}
	void imposta_x(int i) {x=i;}
};


int main()
{
	potenze di2[]= {1,2,4,8,16}; // inizializzato
	potenze di3[5] ;// non inizializzato
	potenze *p;
	int i;
	// Visualizza le potenze di 2
	cout<<"potenze di 2:";
	for(i=0;i<5;i++)
	{cout<< di2[i].prendi_x()<<" ";}

cout <<"\n\n";

	// imposta le potenze di 3
di3[0].imposta_x(1);
di3[1].imposta_x(3);
di3[2].imposta_x(9);
di3[3].imposta_x(27);
di3[4].imposta_x(81);

	// visualizza le potenze di 3
	cout<<"potenze di 3:";
	for(i=0;i<5;i++)
	{cout<< di3[i].prendi_x()<<" ";}

cout <<"\n\n";


// allocazione dinamica di un array
//try
//{
p=new potenze[5]; // nessuna inizializzazione
//}
//catch( bad_alloc xa)
//{
//cout <<"errore di allocazione";
//return 1;
//}

	// inizializza l'array dinamico con le potenze di due
	for(i=0;i<5;i++)
	{p[i].imposta_x(di2[i].prendi_x());}


	// Visualizza le potenze di 2
	cout<<"potenze di 2:";
	for(i=0;i<5;i++)
	{cout<< p[i].prendi_x()<<" ";}

	cout <<"\n\n";

delete [] p;
return 0;
}


